#include "ModificacionCuentaCorriente.h"
#include "ui_ModificacionCuentaCorriente.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *cuenta_corriente_model;

// Cobro Mensual Module
//extern QSqlRelationalTableModel *cobro_mensual_model;

extern QTableView *cuenta_corriente_view;
// MovimientosModule
extern QSqlRelationalTableModel  *movimientos_model;
extern QTableView *movimientos_view;
extern QLineEdit *saldo_line1;
extern QTabWidget *tab;
extern bool movimientosModuleBool;
extern int movimientosModuleIndex;

QString montoDebe;

ModificacionCuentaCorriente::ModificacionCuentaCorriente(QWidget *parent) :
    QWidget(parent),
    cc_model(new QSqlRelationalTableModel(this,enjoylifedb)),
    ui(new Ui::ModificacionCuentaCorriente)
{
    ui->setupUi(this);
    setWindowIcon(QIcon("://Icons/logo_principal.png"));
    setWindowTitle("Modificación Cuenta Corriente");
    setWindowFlags(Qt::WindowMinimizeButtonHint);
    setWindowFlags(Qt::WindowCloseButtonHint);

    cc_model->setTable("cuenta_corriente");

//    cobro_mensual_model = new QSqlRelationalTableModel(this,enjoylifedb);
//    cobro_mensual_model->setTable("cobro_mensual");

    ui->tipo_cobro->addItem("- Elija Tipo Cobro");
    ui->tipo_cobro->addItem("Esporádico");
    ui->tipo_cobro->addItem("Servicio");
    ui->tipo_cobro->setEnabled(false);

    ui->estado_deuda->addItem("No informado"); // index 0
    ui->estado_deuda->addItem("Bonificado"); // index 1
    ui->estado_deuda->addItem("No paga"); // index 2
    ui->estado_deuda->addItem("Debe"); // index 3
    ui->estado_deuda->addItem("Pagó"); // index 4
    //    ui->estado_deuda->setCurrentIndex(0);

    connect(ui->estado_deuda,SIGNAL(currentIndexChanged(int)),this,SLOT(ControlFechaPago()));

    UpdateClientList();

    CargarConceptos();

    ui->raz_social->setEnabled(false);
//    ui->fecha_cc->setEnabled(false);

    id_cc_sel = -1;

    ui->radioBtn_efect->setChecked(true);

    connect(ui->radioBtn_efect,SIGNAL(clicked()),this,SLOT(TipoMonedaEfectivo()));
    connect(ui->radioBtn_cheq,SIGNAL(clicked()),this,SLOT(TipoMonedaCheque()));
    connect(ui->radioBtn_DBco,SIGNAL(clicked()),this,SLOT(TipoMonedaDepBco()));
    connect(ui->radioBtn_TBca,SIGNAL(clicked()),this,SLOT(TipoMonedaTransBca()));

    connect(ui->cerrarBtn,SIGNAL(clicked()),this,SLOT(close()));

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));
}

ModificacionCuentaCorriente::~ModificacionCuentaCorriente()
{
    montoDebe = "";
    delete ui;
}

/**
 * @brief AltaCheque::CargarConceptos
 * Carga conceptos en el combobox
 */
void ModificacionCuentaCorriente::CargarConceptos()
{
    // Carga las personas de la pabla cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto where tipo_concepto = 'Cliente' order by concepto";

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros de conceptos, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->comboBox_concepto_2->addItem("");
    while (query->next()) {
        ui->comboBox_concepto_2->addItem(query->value(query->record().indexOf("concepto")).toString());
    }
}

void ModificacionCuentaCorriente::GetCCInfo(int index)
{
    row = index;
    id_cc_sel = cuenta_corriente_model->index(index,0).data().toInt();

    ui->raz_social->setText(cuenta_corriente_model->index(index,1).data().toString());
    RazSoc = ui->raz_social->text();
    cliente = ui->raz_social->text();

    ui->tipo_cobro->setCurrentIndex(ui->tipo_cobro->findData(cuenta_corriente_model->index(index,2).data().toString(),Qt::DisplayRole));

    // VERRRRRRRRRRRRRRRRRRRRR
    ui->comboBox_concepto_2->addItem(cuenta_corriente_model->index(index,3).data().toString());
    ui->comboBox_concepto_2->setCurrentIndex(ui->comboBox_concepto_2->findData(cuenta_corriente_model->index(index,3).data().toString(),Qt::DisplayRole));

    ui->fecha_cc->setDate(cuenta_corriente_model->index(index,5).data().toDate());

    estadoCtaCte = cuenta_corriente_model->index(index,6).data().toString();

    if (estadoCtaCte == "No informado")
        ui->estado_deuda->setCurrentIndex(0);
    else if (estadoCtaCte == "Bonificado")
        ui->estado_deuda->setCurrentIndex(1);
    else if (estadoCtaCte == "No paga")
        ui->estado_deuda->setCurrentIndex(2);
    else if (estadoCtaCte == "Debe")
        ui->estado_deuda->setCurrentIndex(3);
    else {
        ui->estado_deuda->setCurrentIndex(4);
        pago_debe = cuenta_corriente_model->index(index,11).data().toDouble();
        ui->debe_cc->setText(QString::number(pago_debe));
    }

    QString debe_cc = QString("%1").arg(cuenta_corriente_model->index(index,4).data().toDouble(), 0, 'f', 2);
    montoDebe = debe_cc;
    if (!(ui->estado_deuda->currentIndex() == 4)) {
        // Se calcula recargo
        QVariant val = debe_cc.toFloat();
        const int precision = 2;
        double monto = val.toDouble();
        double recargo = 0;
        if (!ui->estado_deuda->currentIndex() == 4) {
            if (ui->tipo_cobro->currentText() == "Esporádico") {
                QDate date;
                if (ui->fecha_cc->date().month() < date.currentDate().month()) {
                    recargo = monto * 0.1;
                } else {
                    if (ui->fecha_cc->date().month() == date.currentDate().month()) {
                        if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
                            recargo = monto * 0.05;
                        }
                        if (date.currentDate().day() >= 21) {
                            recargo = monto * 0.1;
                        }
                    }
                }
            } else {
                QDate date;
                if (ui->fecha_cc->date().month() < date.currentDate().month()) {
                    recargo = monto * 0.2;
                } else {
                    if (ui->fecha_cc->date().month() == date.currentDate().month()) {
                        if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
                            recargo = monto * 0.1;
                        }
                        if (date.currentDate().day() >= 21) {
                            recargo = monto * 0.2;
                        }
                    }
                }
            }
        }

        QString valor =  QString("%1").arg(val.toDouble() + recargo, 0, 'f', precision);
        ui->debe_cc->setText(valor);
    }

    QString tmoneda = cuenta_corriente_model->index(index,7).data().toString();

    if (tmoneda == "Efectivo")
        ui->radioBtn_efect->setChecked(true);
    else if (tmoneda == "Cheque") {
        ui->radioBtn_cheq->setChecked(true);
        ui->line_idCheq->setCurrentText(cuenta_corriente_model->index(index,8).data().toString());
    }
    else if (tmoneda == "Depósito bancario") {
        ui->radioBtn_DBco->setChecked(true);
        ui->line_idDBco->setText(cuenta_corriente_model->index(index,8).data().toString());
    }
    else if (tmoneda == "Transferencia bancaria") {
        ui->radioBtn_TBca->setChecked(true);
        ui->line_idTBca->setText(cuenta_corriente_model->index(index,8).data().toString());
    }

    ui->descripcion->setPlainText(cuenta_corriente_model->index(index,12).data().toString());

    QDate date;

    if (estadoCtaCte == "Pagó") {
        ui->tipo_cobro->setEnabled(false);
        ui->comboBox_concepto_2->setEnabled(false);
        ui->debe_cc->setEnabled(true);
        ui->radioBtn_efect->setEnabled(false);
        ui->radioBtn_cheq->setEnabled(false);
        ui->line_idCheq->setEnabled(false);
        ui->radioBtn_DBco->setEnabled(false);
        ui->line_idDBco->setEnabled(false);
        ui->radioBtn_TBca->setEnabled(false);
        ui->line_idTBca->setEnabled(false);
        ui->fechaPago->setDate(cuenta_corriente_model->index(index,9).data().toDate());
    }else {
        if (!ui->line_idCheq->currentText().isEmpty()) {
            ui->tipo_cobro->setEnabled(false);
            //            ui->comboBox_concepto_2->setEnabled(false);
            //            ui->debe_cc->setEnabled(false);
            //            ui->radioBtn_efect->setEnabled(false);
            //            ui->radioBtn_cheq->setEnabled(false);
            //            ui->line_idCheq->setEnabled(false);
            //            ui->radioBtn_DBco->setEnabled(false);
            //            ui->line_idDBco->setEnabled(false);
            //            ui->radioBtn_TBca->setEnabled(false);
            //            ui->line_idTBca->setEnabled(false);
            ui->estado_deuda->setEnabled(false);
        }

        date.setDate(0000,00,00);
        ui->fechaPago->setDate(date);

        if (debe_cc.toDouble() < 0) {
            ui->groupBox_TipoMoneda->setEnabled(false);
        }
    }

    BuscarCheques();
}

void ModificacionCuentaCorriente::UpdateClientList()
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);

    if (! query->exec("select razon_social from cliente where estado is null")) {
        QMessageBox::critical(this,"Error","No se pueden recuperar los cliente, intente nuevamente");
        return;
    }
}

void ModificacionCuentaCorriente::RefreshCCView()
{
    cuenta_corriente_model->setHeaderData(0,Qt::Horizontal,"Nro. Cta.");
    cuenta_corriente_model->setHeaderData(2,Qt::Horizontal,"Tipo de Cobro");
    cuenta_corriente_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    cuenta_corriente_model->setHeaderData(4,Qt::Horizontal,"Monto");
    cuenta_corriente_model->setHeaderData(5,Qt::Horizontal,"Desde fecha");
    cuenta_corriente_model->setHeaderData(7,Qt::Horizontal,"Tipo Moneda");
    cuenta_corriente_model->setHeaderData(8,Qt::Horizontal,"Id Moneda");
    cuenta_corriente_model->setHeaderData(9,Qt::Horizontal,"Fecha Pagó");
    cuenta_corriente_model->setHeaderData(11,Qt::Horizontal,"Monto Pagado");
    cuenta_corriente_model->setHeaderData(12,Qt::Horizontal,"Descripción");

    cuenta_corriente_view->setModel(cuenta_corriente_model);
    cuenta_corriente_view->setCornerButtonEnabled(true);
    cuenta_corriente_view->setAlternatingRowColors(true);
    cuenta_corriente_view->setGridStyle(Qt::SolidLine);
    cuenta_corriente_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cuenta_corriente_view->setWordWrap(true);
    cuenta_corriente_view->setSortingEnabled(false);
    cuenta_corriente_view->sortByColumn(5, Qt::AscendingOrder);
//    cuenta_corriente_view->horizontalHeader()->setStretchLastSection(true);
    cuenta_corriente_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    cuenta_corriente_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    cuenta_corriente_view->hideColumn(1);
    cuenta_corriente_view->hideColumn(6);
    cuenta_corriente_view->hideColumn(10);
//    cuenta_corriente_view->hideColumn(11);
}

void ModificacionCuentaCorriente::on_guardarBtn_clicked()
{
    bool mov = false;
    bool borrarFechaPago = false;
    if (ui->tipo_cobro->currentIndex() == 0) {
        QMessageBox::warning(this,"Información!","Por favor, seleccione el tipo de cobro");
        return;
    }

    if (ui->comboBox_concepto_2->currentText().isEmpty()) {
        QMessageBox::warning(this,"Información!","Por favor, ingrese el concepto");
        return;
    }

    if (ui->debe_cc->text().isEmpty()) {
        QMessageBox::warning(this,"Información!","Por favor, ingrese el monto de la deuda");
        return;
    }

    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Cuenta Corriente"),
                                   "¿Está seguro que quiere guardar los cambios?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {

        QString filter = "id_cuenta_cor = '" + QString::number(id_cc_sel) + "'";

//        QString cm_filter = "id_cobro_mensual = '" + QString::number(id_cc_sel) + "'";

        cuenta_corriente_model->setFilter(filter);
//        cobro_mensual_model->setFilter(cm_filter);

        enjoylifedb.transaction();
        if (!(cuenta_corriente_model->select())) {
            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros necesarios de cuenta corriente, intentelo manualmente.");
            enjoylifedb.rollback();
            return;
        }

//        if (!cobro_mensual_model->select()) {
//            QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros necesarios de cobro mensual, intentelo manualmente.");
//            enjoylifedb.rollback();
//            return;
//        }

        enjoylifedb.commit();

        if (cuenta_corriente_model->rowCount() == 1) {/* && cobro_mensual_model->rowCount() == 1) {*/

            QSqlRecord record = cuenta_corriente_model->record(0);

//            QSqlRecord cm_record = cobro_mensual_model->record(0);

            record.setValue("cc_razon_social",ui->raz_social->text());
            cliente = ui->raz_social->text();

//            cm_record.setValue("cm_razon_social",ui->raz_social->text());

            record.setValue("tipo_cobro", ui->tipo_cobro->currentText());

            record.setValue("concepto", ui->comboBox_concepto_2->currentText());

//            cm_record.setValue("concepto",ui->comboBox_concepto_2->currentText());

            record.setValue("descripcion", ui->descripcion->toPlainText());

//            cm_record.setValue("descripcion",ui->descripcion->toPlainText());

            // Monto de la deuda segun estado de la misma
            int index = ui->estado_deuda->currentIndex();
            if (index == 0 || index == 3) {
                record.setValue("debe",QString("%1").arg(ui->debe_cc->text().toDouble(),0,'f',2));

//                cm_record.setValue("debe",QString("%1").arg(ui->debe_cc->text().toDouble(),0,'f',2));
            } else {
                record.setValue("debe",QString("%1").arg(montoDebe.toDouble(),0,'f',2));

//                cm_record.setValue("debe",QString("%1").arg(montoDebe.toDouble(),0,'f',2));
            }

            record.setValue("desde", ui->fecha_cc->date());

//            cm_record.setValue("desde", ui->fecha_cc->date());

            if (ui->estado_deuda->currentIndex() == 0) {
                record.setValue("estado_deuda","No informado");
//                cm_record.setValue("estado_deuda","No informado");
            }
            else if (ui->estado_deuda->currentIndex() == 1) {
                record.setValue("estado_deuda","Bonificado");
//                cm_record.setValue("estado_deuda","Bonificado");
            }
            else if (ui->estado_deuda->currentIndex() == 2) {
                record.setValue("estado_deuda","No paga");
//                cm_record.setValue("estado_deuda","No paga");
            }
            else if (ui->estado_deuda->currentIndex() == 3) {
                record.setValue("estado_deuda","Debe");
//                cm_record.setValue("estado_deuda","Debe");
            }
            else {
                record.setValue("estado_deuda","Pagó");
//                cm_record.setValue("estado_deuda","Pagó");
            }

            // Se almacena el tipo de pago
            if (ui->radioBtn_efect->isChecked()) {
                record.setValue("tipo_moneda","Efectivo");
                record.setValue("id_moneda","");
            }
            else if (ui->radioBtn_cheq->isChecked()) {
                if (ui->line_idCheq->currentText().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia","Ingrese un valor para el id de cheque");
                    return;
                }

                QString id_cheque = ui->line_idCheq->currentText();

                // Selecciono los id de la tabla cheque, para saber si ese id existe
                QSqlQuery *sel_id_cheque = new QSqlQuery(enjoylifedb);

                if (! sel_id_cheque->exec("select id_cheque from cheque")) {
                    QMessageBox::critical(this,"Error crítico", "No se pueden obtener los id de cheques. Intente nuevamente");
                    return;
                }

                bool encontrado = false;
                while (sel_id_cheque->next() && !encontrado) {
                    if (id_cheque == sel_id_cheque->value(0))
                        encontrado = true;
                }

                if (!encontrado) {
                    QMessageBox::critical(this,"Error crítico","No existe el id ingresado en la tabla cheques. Por favor, ingrese un id válido");
                    return;
                }
                else {
                    ui->estado_deuda->setCurrentIndex(0);
                    record.setValue("estado_deuda","No informado");
                    record.setValue("tipo_moneda","Cheque");
                    record.setValue("id_moneda",id_cheque);
                }

                QMessageBox::information(this,"Aviso!","El tipo de cobro fue cambiado a \"No Informado\". "
                                         "Para poder marcar como cobrado este mes realicelo desde el Módulo Cheques por el nro del cheque.");
            }
            else if (ui->radioBtn_DBco->isChecked()) {

                if (ui->line_idDBco->text().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia","Ingrese un valor para el id del depósito bancario");
                    return;
                }

                record.setValue("tipo_moneda","Depósito bancario");
                record.setValue("id_moneda",ui->line_idDBco->text());
            }
            else if (ui->radioBtn_TBca->isChecked()) {

                if (ui->line_idTBca->text().isEmpty()) {
                    QMessageBox::warning(this,"Advertencia","Ingrese un valor para el id la transferencia bancaria");
                    return;
                }

                record.setValue("tipo_moneda","Transferencia bancaria");
                record.setValue("id_moneda",ui->line_idTBca->text());
            }

            // Cambia de algun estado a "Pagó".
            if ((estadoCtaCte != ui->estado_deuda->currentText()) && (ui->estado_deuda->currentIndex() == 4)) {
                pago = true;
                if (ui->radioBtn_cheq->isChecked()) {
                    QString idMoneda = ui->line_idCheq->currentText();
                    QMessageBox::information(this,"AVISO!", tr("Los cambios que intenta realizar en la Cta. Cte. no se permiten debido a que la misma esta asociada a al Cheque Nro.: '%1'."
                                                               "Por favor dirijase al Módulo Cheques para realizar las acciones correspondientes.").arg(idMoneda),
                                             QMessageBox::Ok);
                    return;
                }
                mov = true;
                // Se modifico la cta cte para marcarla como cobrada. Se debe registrar un movimiento
                // Record para movimiento
                QString values = "values (";

                QDate date;
                QString formatDate = "yyyy-MM-dd";
                QString fechaMov = ui->fechaPago->date().toString(formatDate);
                qDebug() << "Fecha PAGO: " << fechaMov;
                // Se agrega fecha de mov.
                values = values + "'" + fechaMov + "',";
                // Se agrega la fecha que pago en la cc
                record.setValue("fecha_pago",ui->fechaPago->date());

                // Se agrega la persona
                values = values + "'" + cliente + "',";
                // Se agrega el concepto
                values = values + "'" + ui->comboBox_concepto_2->currentText() + "',";
                // Se agrega el tipo de moneda
                if (ui->radioBtn_efect->isChecked()) {
                    values = values + "'Efectivo',";
                    //                    tMoneda = 1;
                    // Se agrega el id de la moneda
                    values = values + "'" + ui->line_idCheq->currentText() + "',";
                } else {
                    if (ui->radioBtn_DBco->isChecked()) {
                        values = values + "'Depósito bancario',";
                        //                        tMoneda = 2;
                        // Se agrega el id de la moneda
                        values = values + "'" + ui->line_idDBco->text() + "',";
                    } else {
                        if (ui->radioBtn_TBca->isChecked()) {
                            values = values + "'Transferencia bancaria',";
                            //                            tMoneda = 3;
                            // Se agrega el id de la moneda
                            values = values + "'" + ui->line_idTBca->text() + "',";
                        }
                    }
                }
                // Se agrega el debe
                QVariant val = ui->debe_cc->text().toFloat();
                const int precision = 2;
//                double monto = val.toDouble();
//                double recargo = 0;
//                if (ui->tipo_cobro->currentText() == "Esporádico") {
//                    if (ui->fecha_cc->date().month() < date.currentDate().month()) {
//                        recargo = monto * 0.1;
//                    } else {
//                        if (ui->fecha_cc->date().month() == date.currentDate().month()) {
//                            if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
//                                recargo = monto * 0.05;
//                            }
//                            if (date.currentDate().day() >= 21) {
//                                recargo = monto * 0.1;
//                            }
//                        }
//                    }
//                } else {
//                    if (ui->fecha_cc->date().month() < date.currentDate().month()) {
//                        recargo = monto * 0.2;
//                    } else {
//                        if (ui->fecha_cc->date().month() == date.currentDate().month()) {
//                            if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
//                                recargo = monto * 0.1;
//                            }
//                            if (date.currentDate().day() >= 21) {
//                                recargo = monto * 0.2;
//                            }
//                        }
//                    }
//                }
                values = values + "'" + QString("%1").arg(val.toDouble(), 0, 'f', precision) + "',";
                // Se almacena el monto con recargo en cc
                record.setValue("monto_pagado",QString("%1").arg(val.toDouble(), 0, 'f', precision));

                // Se agrega el haber
                values = values + "'0.00', ";
                // Se agrega el id de la cta cte
                values = values + "'" + QString::number(id_cc_sel) + "')";

                // Se inserta un movimiento si se registra q el cliente Pagó
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "insert into movimiento (fecha_mov,m_persona,m_concepto,tipo_moneda,idMoneda,debe,haber,idCtaCte) " + values;
                enjoylifedb.transaction();
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo cargar el pago de la Cta. Cte. como un movimiento, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
            }
            // No cambia de estado, se mantiene en "Pagó".
            if ((estadoCtaCte == ui->estado_deuda->currentText()) && (ui->estado_deuda->currentIndex() == 4)) {
                if (ui->radioBtn_cheq->isChecked()) {
                    QString idMoneda = ui->line_idCheq->currentText();
                    QMessageBox::information(this,"AVISO!", tr("Los cambios que intenta realizar en la Cta. Cte. no se permiten debido a que la misma esta asociada a al Cheque Nro.: '%1'."
                                                               "Por favor dirijase al Módulo Cheques para realizar las acciones correspondientes.").arg(idMoneda),
                                             QMessageBox::Ok);
                    return;
                }
                mov = true;
                // Se modifico la cta cte para marcarla como cobrada. Se debe registrar un movimiento
                // Record para movimiento
                QString values = "= (";

                QDate date;
                QString formatDate = "yyyy-MM-dd";
                QString fechaMov = ui->fechaPago->date().toString(formatDate);
                qDebug() << "Fecha PAGO: " << fechaMov;
                // Se agrega fecha de mov.
                values = values + "'" + fechaMov + "',";
                // Se agrega la fecha que pago en la cc
                record.setValue("fecha_pago",ui->fechaPago->date());

                // Se agrega la persona
                values = values + "'" + cliente + "',";
                // Se agrega el concepto
                values = values + "'" + ui->comboBox_concepto_2->currentText() + "',";
                // Se agrega el tipo de moneda
                if (ui->radioBtn_efect->isChecked()) {
                    values = values + "'Efectivo',";
                    //                    tMoneda = 1;
                    // Se agrega el id de la moneda
                    values = values + "'" + ui->line_idCheq->currentText() + "',";
                } else {
                    if (ui->radioBtn_DBco->isChecked()) {
                        values = values + "'Depósito bancario',";
                        //                        tMoneda = 2;
                        // Se agrega el id de la moneda
                        values = values + "'" + ui->line_idDBco->text() + "',";
                    } else {
                        if (ui->radioBtn_TBca->isChecked()) {
                            values = values + "'Transferencia bancaria',";
                            //                            tMoneda = 3;
                            // Se agrega el id de la moneda
                            values = values + "'" + ui->line_idTBca->text() + "',";
                        }
                    }
                }
                // Se agrega el debe
                QVariant val = ui->debe_cc->text().toFloat();
                const int precision = 2;
//                double monto = val.toDouble();
//                double recargo = 0;
//                if (ui->tipo_cobro->currentText() == "Esporádico") {
//                    if (ui->fecha_cc->date().month() < date.currentDate().month()) {
//                        recargo = monto * 0.1;
//                    } else {
//                        if (ui->fecha_cc->date().month() == date.currentDate().month()) {
//                            if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
//                                recargo = monto * 0.05;
//                            }
//                            if (date.currentDate().day() >= 21) {
//                                recargo = monto * 0.1;
//                            }
//                        }
//                    }
//                } else {
//                    if (ui->fecha_cc->date().month() < date.currentDate().month()) {
//                        recargo = monto * 0.2;
//                    } else {
//                        if (ui->fecha_cc->date().month() == date.currentDate().month()) {
//                            if (date.currentDate().day() >= 11 && date.currentDate().day() <= 20) {
//                                recargo = monto * 0.1;
//                            }
//                            if (date.currentDate().day() >= 21) {
//                                recargo = monto * 0.2;
//                            }
//                        }
//                    }
//                }
                values = values + "'" + QString("%1").arg(val.toDouble(), 0, 'f', precision) + "',";
                // Se almacena el monto con recargo en cc
                record.setValue("monto_pagado",QString("%1").arg(val.toDouble(), 0, 'f', precision));

                // Se agrega el haber
                values = values + "'0.00'" + ")";
                // Se agrega el id de la cta cte
//                values = values + "'" + QString::number(id_cc_sel) + "')";

                // Se inserta un movimiento si se registra q el cliente Pagó
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "update movimiento set (fecha_mov,m_persona,m_concepto,tipo_moneda,idMoneda,debe,haber) " + values;
                stm.append("where idctacte = '").append(QString::number(id_cc_sel)).append("'");
                enjoylifedb.transaction();
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo modificar el pago de la Cta. Cte. en la tabla movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
            }
            // Cambia de "Pagó" a otro estado.
            if ((estadoCtaCte == "Pagó") && (estadoCtaCte != ui->estado_deuda->currentText())) {
                if (ui->radioBtn_cheq->isChecked()) {
                    QString idMoneda = ui->line_idCheq->currentText();
                    QMessageBox::information(this,"AVISO!", tr("Los cambios que intenta realizar en la Cta. Cte. no se permiten debido a que la misma esta asociada a al Cheque Nro.: '%1'."
                                                               "Por favor dirijase al Módulo Cheques para realizar las acciones correspondientes.").arg(idMoneda),
                                             QMessageBox::Ok);
                    return;
                }
                mov = false;
                // Se elimina un movimiento si se registra que el cliente no Pagó
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "delete from movimiento where idctacte = '";
                stm.append(QString::number(id_cc_sel)).append("'");
                enjoylifedb.transaction();
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo borrar el movimiento correspondiente de la tabla movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }

                borrarFechaPago = true;
            }

            cuenta_corriente_model->setRecord(0, record);
//            cobro_mensual_model->setRecord(0, cm_record);

            enjoylifedb.transaction();
            if (!cuenta_corriente_model->submitAll()) {
                QString error = cuenta_corriente_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados en Cta. Cte., intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }

            if (borrarFechaPago) {
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "update cuenta_corriente set fecha_pago = NULL where id_cuenta_cor = '";
                stm.append(QString::number(id_cc_sel)).append("'");
                enjoylifedb.transaction();
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo actualizar la fecha de pago, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }

                QSqlQuery *query2 = new QSqlQuery(enjoylifedb);
                QString stm2 = "update cuenta_corriente set monto_pagado = NULL where id_cuenta_cor = '";
                stm2.append(QString::number(id_cc_sel)).append("'");
                enjoylifedb.transaction();
                if (! query2->exec(stm2)) {
                    QMessageBox::critical(this,"Error!", "No se pudo actualizar el monto pagado, "
                                          "intentelo nuevamente || " + query2->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
            }

            enjoylifedb.transaction();
//            if (!cobro_mensual_model->submitAll()) {
//                QString error = cobro_mensual_model->lastError().text();
//                QMessageBox::critical(this,"Error!", tr("No se pudo guardar, en Cobro Mensual, los cambios realizados en Cta. Cte., intentelo de nuevo."
//                                                        "\n %1").arg(error));
//                enjoylifedb.rollback();
//                return;
//            }

            if (mov) {
                QMessageBox::information(this,"AVISO!", "Se modifico correctamente la Cta. Cte. Y se realizaron "
                                         "modificaciones sobre la tabla movimientos. Por favor corroborar los datos.");
            }else {
                QMessageBox::information(this,"AVISO!", "Se modifico correctamente la Cta. Cte.");
            }

            // Un commit para la modificación en movimientos y otro para cuenta corriente.
            enjoylifedb.commit();
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
        else {
            QMessageBox::critical(this,"Error!", tr("No se pudo recuperar los datos de cuenta corriente, intentelo de nuevo."));
            enjoylifedb.rollback();
            return;
        }
    }

//    if (ui->tipo_cobro->currentText() == "Servicio")
//        FiltrarCobroServicio();
//    if (ui->tipo_cobro->currentText() == "Esporádico")
//        FiltrarCobroEsporadico();

    ControlVencimientos();
    close();
}

void ModificacionCuentaCorriente::FiltrarCobroEsporadico()
{
    QString filtro = "cc_razon_social = '";
    filtro.append(cliente);
    filtro.append("' and tipo_cobro = 'Esporádico'");

    enjoylifedb.transaction();
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(filtro);
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!", "No hay registros cargados para el tipo de cobro: Esporádico.");
        enjoylifedb.rollback();
        RefreshCCView();
        return;
    }
    enjoylifedb.commit();
    RefreshCCView();
}

void ModificacionCuentaCorriente::FiltrarCobroServicio()
{
    QString filtro = "cc_razon_social = '";
    filtro.append(cliente);
    filtro.append("' and tipo_cobro = 'Servicio'");

    enjoylifedb.transaction();
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(filtro);
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!", "No hay registros cargados para el tipo de cobro: Servicio.");
        enjoylifedb.rollback();
        RefreshCCView();
        return;
    }
    enjoylifedb.commit();
    RefreshCCView();
}

void ModificacionCuentaCorriente::ControlFechaPago()
{
    // Fecha de pago
    QDate date;
    QString formato = "dd/MM/yyyy";
    QString fechaPago = date.currentDate().toString(formato);
    if (ui->estado_deuda->currentIndex() == 4) {
        ui->fechaPago->setDate(date.currentDate());
    } else {
        date.setDate(0000,00,00);
        ui->fechaPago->setDate(date);
    }
    // Monto de la deuda segun estado de la misma
    int index = ui->estado_deuda->currentIndex();
    if (index == 1 || index == 2)
        ui->debe_cc->setText("0.00");
//    else
//        ui->debe_cc->setText(montoDebe);
}

//tipo moneda
void ModificacionCuentaCorriente::TipoMonedaEfectivo()
{
    if (ui->radioBtn_efect->isChecked()) {
        ui->radioBtn_cheq->setChecked(false);
        ui->line_idCheq->setEnabled(false);
        ui->radioBtn_DBco->setChecked(false);
        ui->line_idDBco->setEnabled(false);
        ui->radioBtn_TBca->setChecked(false);
        ui->line_idTBca->setEnabled(false);
    }
}

void ModificacionCuentaCorriente::TipoMonedaCheque()
{
    if (ui->radioBtn_cheq->isChecked()) {
        ui->radioBtn_efect->setChecked(false);
        ui->line_idCheq->setEnabled(true);
        ui->radioBtn_DBco->setChecked(false);
        ui->line_idDBco->setEnabled(false);
        ui->radioBtn_TBca->setChecked(false);
        ui->line_idTBca->setEnabled(false);
    }
}

void ModificacionCuentaCorriente::TipoMonedaDepBco()
{
    if (ui->radioBtn_DBco->isChecked()) {
        ui->radioBtn_efect->setChecked(false);
        ui->radioBtn_cheq->setChecked(false);
        ui->line_idCheq->setEnabled(false);
        ui->line_idDBco->setEnabled(true);
        ui->radioBtn_TBca->setChecked(false);
        ui->line_idTBca->setEnabled(false);
    }
}

void ModificacionCuentaCorriente::TipoMonedaTransBca()
{
    if (ui->radioBtn_TBca->isChecked()) {
        ui->radioBtn_efect->setChecked(false);
        ui->radioBtn_cheq->setChecked(false);
        ui->line_idCheq->setEnabled(false);
        ui->radioBtn_DBco->setChecked(false);
        ui->line_idDBco->setEnabled(false);
        ui->line_idTBca->setEnabled(true);
    }
}

// Funciones para actualizar correctamente la vista y el saldo en movimientos

/*
 * Acción del boton: Actualiza la lista de moviemientos.
 */
void ModificacionCuentaCorriente::UpdateMovimientosList()
{
    QDate date;
    date.setDate(date.currentDate().year(),date.currentDate().month(),date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);

    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";
    movimientos_model->setTable("movimiento");
    movimientos_model->filter().clear();
    movimientos_model->setFilter(filtroMov);
    if (!(movimientos_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModelMov();
    CalcularSaldoMensual();
}

/*
 * Acomoda la vista del modulo Movimientos.
 */
void ModificacionCuentaCorriente::CorrectViewOfModelMov()
{
    movimientos_model->setHeaderData(1,Qt::Horizontal,"Fecha");
    movimientos_model->setHeaderData(2,Qt::Horizontal,"Persona");
    movimientos_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    movimientos_model->setHeaderData(4,Qt::Horizontal,"Tipo Moneda");
    movimientos_model->setHeaderData(5,Qt::Horizontal,"Debe");
    movimientos_model->setHeaderData(6,Qt::Horizontal,"Haber");

    movimientos_view->setModel(movimientos_model);
    movimientos_view->setCornerButtonEnabled(true);
    movimientos_view->setAlternatingRowColors(true);
    movimientos_view->setGridStyle(Qt::SolidLine);
    movimientos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    movimientos_view->setWordWrap(true);
    movimientos_view->horizontalHeader()->setStretchLastSection(true);
    movimientos_view->sortByColumn(1,Qt::SortOrder());
    movimientos_view->hideColumn(0);
    movimientos_view->hideColumn(7);

    movimientos_view->setColumnWidth(1,90);
    movimientos_view->setColumnWidth(2,300);
    movimientos_view->setColumnWidth(3,300);
    movimientos_view->setColumnWidth(4,120);
    movimientos_view->setColumnWidth(5,100);
    movimientos_view->setColumnWidth(6,100);
}

/*
 *
 */
void ModificacionCuentaCorriente::CalcularSaldoMensual()
{
    QDate date;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString formatYear = "yyyy";
    QString formatMonth = "MM";
    QString anio, mes;
    anio = date.toString(formatYear);
    mes = date.toString(formatMonth);
    QString filtroMov;
    filtroMov = "date_part('year', fecha_mov) = '" + anio + "'";
    filtroMov = filtroMov + " and date_part('month', fecha_mov) = '" + mes + "'";

    enjoylifedb.transaction();
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select sum(debe) as sumDebe, sum(haber) as sumHaber from movimiento where " + filtroMov;
    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudo recuperar los datos necesarios para calcular el saldo actual, "
                              "intentelo nuevamente || " + query->lastError().text());
        enjoylifedb.rollback();
        return;
    }

    double sumDebe = 0.00;
    double sumHaber = 0.00;
    while (query->next()) {
        if (query->last()) {
            sumDebe = query->value(query->record().indexOf("sumDebe")).toDouble();
            sumHaber = query->value(query->record().indexOf("sumHaber")).toDouble();
        }
    }
    QVariant val = sumDebe - sumHaber;
    const int precision = 2;
    saldo_line1->setText(QString("%1").arg(val.toDouble(), 0, 'f', precision));

    enjoylifedb.commit();
}

/**
 * @brief ModificacionCuentaCorriente::ControlVencimientos
 */
void ModificacionCuentaCorriente::ControlVencimientos()
{
    int cantRows = 0;
    QDate date2;
    QString formatoMes = "MM";
    QString mes = date2.currentDate().toString(formatoMes);
    QString formatoAnio = "yyyy";
    QString anio = date2.currentDate().toString(formatoAnio);
    QString filtro;
    filtro = "date_part('month', desde) <= '";
    filtro.append(mes).append("'");
    filtro.append(" and date_part('year', desde) <= '");
    filtro.append(anio).append("'");
    filtro.append(" and estado_deuda = 'No informado'");

    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(filtro);

//    cobro_mensual_model->setTable("cobro_mensual");
//    cobro_mensual_model->setFilter(filtro);

    enjoylifedb.transaction();
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de las Ctas. Ctes.");
        enjoylifedb.rollback();
        CleanCCList();
        return;
    }

//    if (!cobro_mensual_model->select()) {
//        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de los Cobros Mensuales.");
//        enjoylifedb.rollback();
//        return;
//    }

    cantRows = cuenta_corriente_model->rowCount();

    if (cantRows > 0) {
        for (int i = 0; i < cantRows; ++i) {

            QSqlRecord record = cuenta_corriente_model->record(i);
//            QSqlRecord cm_record = cobro_mensual_model->record(i);

            record.setValue("estado_deuda","Debe");
//            cm_record.setValue("estado_deuda","Debe");

            cuenta_corriente_model->setRecord(i, record);
//            cobro_mensual_model->setRecord(i,cm_record);

            enjoylifedb.transaction();
            if (!cuenta_corriente_model->submitAll()) {
                QString error = cuenta_corriente_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                CleanCCList();
                return;
            }
//            if (!cobro_mensual_model->submitAll()) {
//                QString error = cobro_mensual_model->lastError().text();
//                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de un Cobro Mensual. Por favor controle los Cobros Mensuales."
//                                                        "\n %1").arg(error));
//                enjoylifedb.rollback();
//                //                CleanCCList();
//                return;
//            }
//            enjoylifedb.commit();
            enjoylifedb.commit();
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
    }
    CleanCCList();
}

void ModificacionCuentaCorriente::CleanCCList()
{
    QString Filtro = "cc_razon_social = '";
    Filtro.append(cliente).append("'");
    enjoylifedb.transaction();
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(Filtro);
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        RefreshCCView();
        return;
    }
    enjoylifedb.commit();
    RefreshCCView();
}

//void ModificacionCuentaCorriente::UpdateCCList()
//{
//    QDate date;
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString formatYear = "yyyy";
//    QString anio = date.toString(formatYear);
//    cliente = client_cc_model->index(selection,1).data().toString();
//    enjoylifedb.transaction();
//    QString filtro = "cc_razon_social = '";
//    filtro.append(cliente);
////        filtro.append("' and tipo_cobro = 'Servicio'");
//    filtro.append("' and date_part('year', desde) = '").append(anio).append("'");
//    cuenta_corriente_model->setTable("cuenta_corriente");
//    cuenta_corriente_model->setFilter(filtro);

//    if (! cuenta_corriente_model->select()) {
//        QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
//        enjoylifedb.rollback();
//        RefreshCCView();
//        return;
//    }

//    enjoylifedb.commit();
//    ActualizarDeuda(cliente);
//    RefreshCCView();
//}

//void ModificacionCuentaCorriente::ActualizarDeuda(QString client_selected)
//{
//    //    QString client_selected = cuenta_corriente_model->index(cuenta_corriente_view->currentIndex().row(),1).data().toString();
//    label_client_sel->clear();
//    QString lab_sel;
//    lab_sel.append("Deuda de ").append(client_selected);
//    label_client_sel->setText(lab_sel);

//    // =================================================================
//    QSqlQuery *query_total = new QSqlQuery(enjoylifedb);

//    QString str_query;
//    str_query.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
//    str_query.append(client_selected);
//    str_query.append("'");
//    str_query.append(" and estado_deuda = 'Debe'");

//    if (! query_total->exec(str_query)) {
//        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
//        return;
//    }

//    double suma_total = -1;
//    while (query_total->next())
//        suma_total = query_total->value(0).toDouble();

//    const int precision = 2;
//    deuda_cliente_edit->clear();
//    deuda_cliente_edit->setText(QString("%1").arg(suma_total, 0, 'f', precision));

//    // =================================================================
//    QSqlQuery *query_pagina = new QSqlQuery(enjoylifedb);
//    QString str_query2;
//    str_query2.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
//    str_query2.append(client_selected);
//    str_query2.append("'").append(" and tipo_cobro = 'Esporádico'");

//    if (! query_pagina->exec(str_query2)) {
//        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
//        return;
//    }

//    double suma_pag = -1;
//    while (query_pagina->next())
//        suma_pag = query_pagina->value(0).toDouble();

//    deuda_pagina_edit->clear();
//    deuda_pagina_edit->setText(QString("%1").arg(suma_pag, 0, 'f', precision));

//    // =================================================================
//    QDate date;
//    QString formatAnio = "yyyy";
//    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
//    QString anio = date.toString(formatAnio);
//    QSqlQuery *query_servicio = new QSqlQuery(enjoylifedb);
//    QString str_query3;
//    str_query3.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
//    str_query3.append(client_selected);
//    str_query3.append("' and tipo_cobro = 'Servicio'");
//    str_query3.append(" and date_part('year', desde) = '");
//    str_query3.append(anio).append("'");

//    if (! query_servicio->exec(str_query3)) {
//        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
//        return;
//    }

//    double suma_serv = -1;
//    while (query_servicio->next())
//        suma_serv = query_servicio->value(0).toDouble();

//    deuda_servicios_edit->clear();
//    deuda_servicios_edit->setText(QString("%1").arg(suma_serv, 0, 'f', precision));
//}

void ModificacionCuentaCorriente::BuscarCheques()
{
    // Carga los cheques asociados a un cliente
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select id_cheque from cheque where c_persona = '";
    stm.append(RazSoc).append("'");

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los nros. de cheques, "
                              "intentelo nuevamente || " + query->lastError().text());
        return;
    }
    ui->line_idCheq->addItem("");
    while (query->next()) {
        ui->line_idCheq->addItem(QString::number(query->value(query->record().indexOf("id_cheque")).toInt()));
    }
}
